#include <stdio.h>
#include <stdlib.h>
#include "mtlib.c"




void imprimirSectoresRecorridos(char *,t_nodo *, int *, int *);

void trace(t_nodo *);






void imprimirSectoresRecorridos(char * lineaTrace, t_nodo * nodoSolicitado, int * cantSecRec, int * cantPisRec){



int salir  = 0;

*cantSecRec = 0;

*cantPisRec = 0;



int contadorPistas = 0;

int contadorSectores = 0;



sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);



if ((nodoSolicitado->pista == CHS.pista) && (nodoSolicitado->nroSector == CHS.sector))

    salir = 1;



else{





if (nodoSolicitado->pista >= CHS.pista) {

    while(!salir){

        while(CHS.pista != nodoSolicitado->pista){ //mientras no encuentre la pista solicitada

            if(CHS.pista == cantidadPistas - 1){

                CHS.pista = 0;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantPisRec) ++;

            }

            else {

                CHS.pista = CHS.pista + 1;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantPisRec) ++;

                contadorPistas ++;

                               if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

                                   }

            }

        }



        while(CHS.sector != nodoSolicitado->nroSector){// mientras no encuentre el sector solicitado

            if(CHS.sector == cantSecPorPista - 1){

                CHS.sector = 0;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantSecRec) ++;

                contadorSectores++;

                                  if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

                                   }



            }

            else{

                CHS.sector = CHS.sector + 1;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantSecRec) ++;

                contadorSectores++;

                                  if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

                                   }

            }

            salir = 1;

            mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

        }

     }

}





else {

    while(!salir){

        while(CHS.pista != nodoSolicitado->pista){//mientras no encuentre la pista solicitada

            CHS.pista = CHS.pista - 1;

            sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

            (*cantPisRec) ++;

            contadorPistas ++;

                               if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

        }

        while(CHS.sector != nodoSolicitado->nroSector){//mientras no encuentre el sector solicitado

            if (CHS.sector == cantSecPorPista - 1) {

                CHS.sector = 0;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantSecRec) ++;

                contadorSectores++;

                                  if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

                                   }

            }

            else{

                CHS.sector = CHS.sector + 1;

                sprintf(lineaTrace, "%s %lu:%lu,", lineaTrace, CHS.pista, CHS.sector);

                (*cantSecRec) ++;

                contadorSectores++;

                                  if( (contadorPistas + contadorSectores)>=20){

                               mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

                               contadorPistas = 0;

                               contadorSectores = 0;

                                   }

            }

        salir = 1;

        mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

        }

    }

}

}

}
}


void trace (t_nodo * nodoSolicitado){

t_nodo * nodoSolicitadoSiguiente = NULL;

int tiempoConsumido = 0;

int  cantSecRec = 0;

int  cantPisRec = 0;

char lineaTrace[50000];



*lineaTrace = 0;



    sprintf(lineaTrace,"Posicion Actual: %lu:%lu \n",CHS.pista,CHS.sector);

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

    sprintf(lineaTrace,"Sector Solicitado: %lu:%lu \n", nodoSolicitado->pista, nodoSolicitado->nroSector);

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

    sprintf(lineaTrace,"Sectores Recorridos: ");

    imprimirSectoresRecorridos(lineaTrace,nodoSolicitado,&cantSecRec, &cantPisRec); //verificar el parametro con los *

    sprintf(lineaTrace, "%s\n", lineaTrace);

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

    tiempoConsumido = (cantPisRec * T_SaltoPista) + (cantSecRec * T_SaltoSector);

    sprintf(lineaTrace, "Tiempo Consumido: %d ms \n", tiempoConsumido);

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

    //pthread_mutex_lock(&buffer_lock);
    sem_wait(&semaforo1);
    nodoSolicitadoSiguiente = algoritmoDePlanificacion();
    //pthread_mutex_unlock(&buffer_lock);
    sem_post(&semaforo1);
    if(nodoSolicitadoSiguiente == NULL){

        sprintf(lineaTrace, "Proximo Sector: ...");

    }

    else {

    sprintf(lineaTrace, "Proximo Sector: %lu:%lu \n", nodoSolicitadoSiguiente->pista, nodoSolicitadoSiguiente->nroSector);

    }

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente,MTR_TRACE_DISCO,(char*)lineaTrace);

    mtf_enviar_mensaje(centroMensajes, nodoSolicitado->remitente, MTR_FIN_TRACE_DISCO);
}


